java Iterator<E>的问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 03:05:58
接口是不能被实例化的,接口中的方法都是没有方法体的抽象方法。
那么请问:
List list=new Arraylist();
list.add( "aaa ");
list.add( "bbb ");
Iterator it=list.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
Iterator是一个接口,为什么它可以被实例化?就是Iterator it=list.iterator();这句,list.iterator()方法返回了一个Iterator的对象。接口中的方法都是没有方法体的抽象方法。为什么可以直接用it.hasNext(),it.next()),这些没有方法体的方法。没有方法体的方法应该什么都没实现啊?

java.util包里关于List有很多的对应的实现,Iterator是为了满足遍历的需求写的一个接口。因为相关的内容很多,而且大体都是一个模式,所以我举例说明。

在你这里采用了ArrayList来实例化一个List,所以对应的Iterator接口是在ArrayList里实现的。
我们可以找一下jdk源代码:
public class ArrayList<E> extends AbstractList<E>
AbstractList<E> extends AbstractCollection<E>
AbstractCollection<E> implements Collection<E>
Collection<E> extends Iterable<E>

终于找到了这个,我们确定了,ArrayList对于Iterable的实现是在AbstractCollection这一层实现了Iterable接口。而这个接口的内容是:public interface Iterable<T> {

/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator<T> iterator();
}
具体的实现在ArrayList这个类里,
private class Itr implements Iterator<E>
你可以找源代码看一下,这个内部类实现了Iterator的所有内容。

到这里,你肯定已经明白了,实际上并不是没有实现,只是实现的过程比较曲折了一些。

这里,JDK在实现上采用了Iterator模式,这个模式的大体意义是让被遍历体与遍历的具体实现分离,只要实现Iterable接口即可通过得到一个It